<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Promise</title>
</head>
<body>

<script>
	//JavaScript是单线程执行，由于这个特定，导致所有的网络操作，浏览器时间都是异步执行，异步执行可以调用回调函数实现
	function callBack() {
		console.log()
		console.log("Done,当前时间:" + new Date().toLocaleTimeString());
	}
	console.log("before setTimeOut()");
	//setTimeout(callBack,2000);
	console.log("after setTimeOut()");

	//其中AJAX就是典型的异步操作
	/**
	 request.onreadystatechange = function () {
		    if (request.readyState === 4) {
		        if (request.status === 200) {
		            return success(request.responseText);
		        } else {
		            return fail(request.status);
		        }
		    }
		}
	 把回调函数success(request.responseText)和fail(request.status)写到一个AJAX操作里很正常，但是不好看，而且不利于代码复用。
	 */


	/**
	 * 更好的解决方案
	 * 1:格式优美
	 * 2:代码复用
	 * 统一执行处理结果，根据结果是成功失败，在未来的某一时刻调用success,fail函数
	 * let ajax = ajaxGet("http://...");
	 * ajax.ifSuccess(success)
	 *     .ifFail(fail);
	 *
	 */
	//ES6有Promise对象可以实现这样的操作，承诺在未来的某一时刻执行操作
	//Promise Demo 生成一个0-2之间的随机数，如果小于1，则等待一段时间后返回成功，否则返回失败：

	function test(resolve,reject) {
		let timeOut = Math.random() * 2;
		console.log("set timeout to:" + timeOut + " seconds.");
		setTimeout(function () {
			if (timeOut < 1) {
				console.log("Call resolve()!");
				resolve("200 OK");
			} else {
				console.log("call reject()!");
				reject("timeout in " + timeOut + " seconds.");
			}
		},timeOut * 1000)
	}

	let p1 = new Promise(test);
	let p2 = p1.then(function (result) {
		console.log("成功!" + result);
	});
	p2.catch(function (result) {
		console.log("失败" + result);
	})

	// function multiply(input) {
	// 	return new Promise(function (resolve, reject) {
	// 		console.log("calculating " + input + "x" + input);
	// 		setTimeout(resolve,1000,input * input);
	// 	})
	// }
	//
	// function add(input) {
	// 	return new Promise(function (resolve,reject) {
	// 		console.log("calculating " + input + "+" + input);
	// 		setTimeout(resolve,1000,input + input);
	// 	})
	// }
	//
	// let p = new Promise(function (resolve,reject) {
	// 	console.log("start new Promise!");
	// 	resolve(123);
	// });
	//
	// p.then(multiply)
	// .then(add)
	// .then(multiply)
	// .then(add)
	// .then(function (result) {
	// 	console.log("Got value:" + result);
	// });
</script>
</body>
</html>